#include <stdio.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "iot_pwm.h"
#include "hi_io.h"
#include "hi_pwm.h"
#include "hi_time.h"

/* --- 播放新乐谱: 《世上只有妈妈好》 ---
 * 1. 【宏定义】为新乐谱的音符创建了宏。
 * 2. 【已修改】g_tuneFreqs[] 被重建，以包含新乐谱所需的低、中、高音。
 * 3. 【已修改】g_scoreNotes[] 和 g_scoreDurations[] 被替换为新乐谱。
 * 4. 【已修改】beepInit() 和 beepSingTask() 已配置为使用 GPIO 11 / PWM2。
 */

// --- 1. 新乐谱的音符宏定义 ---
#define REST    0  // 休止符
#define L_LA    1  // 低音 6 (6.)
#define M_DO    2  // 中音 1
#define M_RE    3  // 中音 2
#define M_MI    4  // 中音 3
#define M_SO    5  // 中音 5
#define M_LA    6  // 中音 6
#define H_DO    7  // 高音 1 (i)

// --- 2. 重建的音符频率分频值（40MHz时钟） ---
static const uint16_t g_tuneFreqs[] = {
    0,      // 0: REST (休止符)
    181818, // 1: L_LA (低音La, A3, 220.00 Hz)
    152964, // 2: M_DO (中音Do, C4, 261.63 Hz)
    136211, // 3: M_RE (中音Re, D4, 293.66 Hz)
    121348, // 4: M_MI (中音Mi, E4, 329.63 Hz)
    102040, // 5: M_SO (中音So, G4, 392.00 Hz)
    90909,  // 6: M_LA (中音La, A4, 440.00 Hz)
    76449,  // 7: H_DO (高音Do, C5, 523.25 Hz)
};

// --- 3. 新乐谱 g_scoreNotes[] ---
static const uint8_t g_scoreNotes[] = {
    // 世上只有妈妈好
    L_LA, M_SO, M_MI, M_SO, H_DO, M_LA, M_SO, M_LA, M_LA,
    // 有妈的孩子像个宝
    M_MI, M_SO, M_LA, M_SO, M_MI, M_DO, M_LA, M_SO, M_MI, M_RE, M_RE,
    // 投进妈妈的怀抱
    M_RE, M_MI, M_SO, M_LA, M_MI, M_RE, M_DO, M_DO,
    // 幸福享不了
    M_SO, M_MI, M_RE, M_DO, M_LA, M_DO, M_SO
};

// --- 4. 新乐谱时值 g_scoreDurations[] ---
// (1 = 125ms 十六分音符; 2 = 250ms 八分音符; 4 = 500ms 四分音符; 8 = 1000ms 半音符)
static const uint8_t g_scoreDurations[] = {
    // 6. 5 3 5 | i 6 5 6 -
    4, 4, 4, 4, 2, 2, 2, 2, 8, // 最后的6-是半音符
    // 3 5 6 5 3 | 1 6 5 3 2 -
    2, 2, 2, 2, 4, 2, 2, 2, 2, 8, // 最后的2-是半音符
    // 2. 3 5 5 6 | 3 2 1 -
    4, 4, 4, 2, 2, 4, 4, 8, // 最后的1-是半音符
    // 5. 3 2 1 6 1 | 5 . - -
    4, 4, 4, 4, 4, 4, 16 // 最后的5是全音符
};


// --- 5. 硬件初始化函数 (GPIO 11 / PWM2) ---
static void beepInit(void) {
    hi_gpio_init(); 
    // 【已修改】使用 GPIO 11 和 PWM2
    hi_io_set_func(HI_IO_NAME_GPIO_11, HI_IO_FUNC_GPIO_11_PWM2_OUT); 
    hi_pwm_init(HI_PWM_PORT_PWM2); 
    hi_pwm_set_clock(PWM_CLK_XTAL); 
}

// --- 6. 播放任务 ---
static void beepSingTask(void *arg) {
    (void)arg;
    beepInit();

    while (1) // 增加循环，使歌曲重复播放
    {
        for (size_t i = 0; i < sizeof(g_scoreNotes) / sizeof(g_scoreNotes[0]); i++) {
            uint8_t note = g_scoreNotes[i];
            
            if (note >= (sizeof(g_tuneFreqs) / sizeof(g_tuneFreqs[0]))) {
                printf("Error: Note index %d out of bounds!\n", note);
                continue;
            }
            
            uint16_t freqDiv = g_tuneFreqs[note];
            uint32_t duration = g_scoreDurations[i] * (125 * 1000);

            if (note != REST)
            {
                // 【已修改】使用 PWM2
                hi_pwm_start(HI_PWM_PORT_PWM2, freqDiv / 2, freqDiv);
                hi_udelay(duration);
                hi_pwm_stop(HI_PWM_PORT_PWM2);
            } else {
                hi_udelay(duration);
            }
            
            hi_udelay(50000); 
        }
        
        osDelay(2000);
    }
}

// 任务入口
static void BeepEntry(void) {
    osThreadAttr_t attr = {
        .name = "beepSingTask",
        .stack_size = 4096,
        .priority = osPriorityNormal,
    };
    if (osThreadNew(beepSingTask, NULL, &attr) == NULL) {
        printf("Failed to create beepSingTask!\n");
    }
}

SYS_RUN(BeepEntry);